package com.horizon.common.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

/**
 * 基于JDK1.8的日期工具类
 *
 * @author wangfuwei
 * @version 2018-08-04
 */
public class DateUtil {

    private static String DATE = "yyyy-MM-dd";

    private static String DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * 字符串转为LocalDateTime
     *
     * @param date 日期时间字符串
     * @return
     */
    public static LocalDateTime parseDateTime(String date) {
        return parseDateTime(date, DATE_TIME);
    }

    /**
     * 字符串转为LocalDateTime
     *
     * @param date    日期时间字符串
     * @param pattern 转换格式
     * @return
     */
    public static LocalDateTime parseDateTime(String date, String pattern) {
        if (StringUtil.isEmpty(date)) return null;
        if (StringUtil.isEmpty(pattern)) pattern = DATE_TIME;
        return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 字符串转为LocalDate
     *
     * @param date 日期字符串
     * @return
     */
    public static LocalDate parseDate(String date) {
        return parseDate(date, DATE);
    }

    /**
     * 字符串转为LocalDate
     *
     * @param date    日期字符串
     * @param pattern 转换格式
     * @return
     */
    public static LocalDate parseDate(String date, String pattern) {
        if (StringUtil.isEmpty(date)) return null;
        if (StringUtil.isEmpty(pattern)) pattern = DATE;
        return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 日期时间转换为字符串
     *
     * @param localDateTime 日期时间
     * @return
     */
    public static String formatDateTime(LocalDateTime localDateTime) {
        return formatDateTime(localDateTime, DATE_TIME);
    }

    /**
     * 日期时间转换为字符串
     *
     * @param localDateTime 日期时间
     * @param pattern       转换格式
     * @return
     */
    public static String formatDateTime(LocalDateTime localDateTime, String pattern) {
        if (localDateTime == null) return null;
        if (StringUtil.isEmpty(pattern)) pattern = DATE_TIME;
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 日期转换为字符串
     *
     * @param localDate 日期
     * @return
     */
    public static String formatDate(LocalDate localDate) {
        return formatDate(localDate, DATE);
    }

    /**
     * 日期转换为字符串
     *
     * @param localDate 日期
     * @param pattern   转换格式
     * @return
     */
    public static String formatDate(LocalDate localDate, String pattern) {
        if (localDate == null) return null;
        if (StringUtil.isEmpty(pattern)) pattern = DATE;
        return localDate.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 本月第一天
     *
     * @param localDate 当前日期
     * @return
     */
    public static LocalDate firstDay(LocalDate localDate) {
        return localDate.with(TemporalAdjusters.firstDayOfMonth());
    }

    /**
     * 本月第一天
     *
     * @param localDateTime 当前日期时间
     * @return
     */
    public static LocalDateTime firstDay(LocalDateTime localDateTime) {
        LocalDateTime dateTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth());
        dateTime = dateTime.withHour(0).withMinute(0).withSecond(0);
        return dateTime;
    }

    /**
     * 本月最后一天
     *
     * @param localDate 当前日期
     * @return
     */
    public static LocalDate lastDay(LocalDate localDate) {
        return localDate.with(TemporalAdjusters.lastDayOfMonth());
    }

    /**
     * 本月最后一天
     *
     * @param localDateTime 当前日期时间
     * @return
     */
    public static LocalDateTime lastDay(LocalDateTime localDateTime) {
        LocalDateTime dateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
        dateTime = dateTime.withHour(23).withMinute(59).withSecond(59);
        return dateTime;
    }

    /**
     * 设置通用日期格式化
     *
     * @param pattern 格式化
     */
    public static void setDATE(String pattern) {
        DateUtil.DATE = pattern;
    }

    /**
     * 设置通用日期时间格式化
     *
     * @param pattern 格式化
     */
    public static void setDateTime(String pattern) {
        DateUtil.DATE_TIME = pattern;
    }
}
